/* 
    扫描器类
*/
export default class Scanner {
    constructor(template) {
        // 原始字符串
        this.originTemplate = template
        // 原始索引长度
        this.len = template.length
        // 指针
        this.pos = 0
        // 尾巴字符串
        this.tail = template
    }

    // 功能弱，走过指定内容，无返回值
    scan (tag) {
        if (this.tail.indexOf(tag) == 0) {
            // tag有多长，就让指针后移多少位
            this.pos += tag.length
            // 改变尾巴
            this.tail = this.originTemplate.substring(this.pos)
        }
    }

    // 让指针进行扫描，直到遇见指定内容结束，返回结束之前路过的文字
    scanUtils (stopStr) {
        // 1 记录初始pos值
        let start_pos = this.pos
        // 2 移动指针查找
        while (this.eos() && this.tail.indexOf(stopStr) != 0) {
            this.pos++
            this.tail = this.originTemplate.substring(this.pos)
        }
        // 3 记录末尾指针位置
        let end_pos = this.pos
        // 4 返回查找的字符串
        return this.originTemplate.substring(start_pos, end_pos)
    }

    // end of string 指针是否到头
    eos () {
        return this.pos < this.len
    }

    // 开始扫描
    startScan (tokens) {
        while (this.pos != this.len) {
            // 1 收集 前置字符串
            let word = this.scanUtils('{{')
            // 2 推进tokens中
            tokens.push(['text', word])
            // 3 路过 {{
            this.scan('{{')
            // 4 收集 key值
            let key = this.scanUtils('}}')
            // 5 推进tokens中
            if (key != '') {
                if (key[0] === '#') {
                    tokens.push([key[0], key.substring(1)])
                }
                else if (key[0] === '/') {
                    tokens.push([key[0], key.substring(1)])
                }
                else {
                    tokens.push(['name', key.replace(/^\s+|\s+$/g, '')])
                }
            }
            // 6 路过 }}
            this.scan('}}')
        }
    }
}
